<?php
// Author : evilair
// Time   : 2017/07/26
/****************************************
*
* 给定一个字符串,找出没有重复字母的最长子串的长度
* 例如: 'abcabcbb' 无重复字母的最长子串是'abc',它的长度是3
* 'bbbbbb' 最长子串是'b',它的长度是1
***************************************/
function longLen($str) {
  /*
  * 把字符串的每一个值作为键放入关联数组中,索引值做为值.
  * 当有的字母放入数组的时候,我们可以知道
  * 是否冲突,以及冲突的索引值,即上一次字母在字符串中出现的位置.
  */
  $letterArr = array();
  $len = strlen($str);
  $maxLen = 0;
  $lastRepeatPos = -1;
  for ($i = 0; $i < $len; $i++) {
    if (array_key_exists($str[$i], $letterArr) && $lastRepeatPos < $letterArr[$str[$i]]) {
      $lastRepeatPos = $letterArr[$str[$i]];
    }
    if ($i - $lastRepeatPos > $maxLen) {
      $maxLen = $i - $lastRepeatPos;
    }
    $letterArr[$str[$i]] = $i;
  }
  return $maxLen;
}

$str = 'abcdefabcdefgbb';
echo longLen($str);
?>